package com.elitedatai.mchtest.wayline.service;

import com.elitedatai.mchtest.common.model.CustomClaim;
import com.elitedatai.mchtest.wayline.model.dto.ConditionalWaylineJobKey;
import com.elitedatai.mchtest.wayline.model.dto.WaylineJobDTO;
import com.elitedatai.mchtest.wayline.model.param.CreateJobParam;
import com.elitedatai.mchtest.wayline.model.param.UpdateJobParam;
import com.dji.sdk.common.HttpResultResponse;

import java.sql.SQLException;
import java.util.Collection;
import java.util.List;


public interface IFlightTaskService {


    /**
     * 向机库发布航线路线任务
     * 该方法用于创建并发布一个新的航线路线任务到指定的机库设备
     * @param param 创建任务的参数对象，包含任务的基本信息和配置
     * @param customClaim 用户信息对象，包含当前操作用户的身份认证信息
     * @return HttpResultResponse HTTP响应结果对象，包含任务发布的结果信息
     * @throws SQLException SQL数据库异常，当数据库操作失败时抛出
     */
    HttpResultResponse publishFlightTask(CreateJobParam param, CustomClaim customClaim) throws SQLException;

    /**
     * 发布单个航线路线任务到机库
     * 该方法用于将单个航线路线任务发布到指定的机库设备执行
     * @param waylineJob 航线路线任务数据传输对象，包含任务的详细配置信息
     * @return HttpResultResponse HTTP响应结果对象，包含任务发布的结果信息
     * @throws SQLException SQL数据库异常，当数据库操作失败时抛出
     */
    HttpResultResponse publishOneFlightTask(WaylineJobDTO waylineJob) throws SQLException;

    /**
     * 立即执行指定的航线路线任务
     * 该方法用于将处于准备状态的任务立即执行，跳过任务队列的等待时间
     * @param workspaceId 工作空间ID，用于标识任务所属的工作空间环境
     * @param jobId 任务ID，用于唯一标识需要立即执行的任务
     * @return Boolean 执行结果，true表示执行成功，false表示执行失败
     */
    Boolean executeFlightTask(String workspaceId, String jobId);

    /**
     * 根据任务ID取消一个或多个航线路线任务
     * 该方法用于取消已发布但尚未执行完成的任务
     * @param workspaceId 工作空间ID，用于标识任务所属的工作空间环境
     * @param jobIds 任务ID集合，包含需要取消的所有任务的唯一标识符
     * @throws SQLException SQL数据库异常，当数据库操作失败时抛出
     */
    void cancelFlightTask(String workspaceId, Collection<String> jobIds);

    /**
     * 发布取消任务指令到机库
     * 该方法用于取消已发布到机库但尚未开始执行的任务
     * @param workspaceId 工作空间ID，用于标识任务所属的工作空间环境
     * @param dockSn 机库序列号，用于标识需要取消任务的目标机库设备
     * @param jobIds 任务ID列表，包含需要取消的所有任务的唯一标识符
     */
    void publishCancelTask(String workspaceId, String dockSn, List<String> jobIds);

    /**
     * 设置任务的媒体文件立即上传
     * 该方法用于将指定任务产生的媒体文件（如照片、视频）设置为最高优先级上传
     * @param workspaceId 工作空间ID，用于标识任务所属的工作空间环境
     * @param jobId 任务ID，用于唯一标识需要立即上传媒体文件的任务
     */
    void uploadMediaHighestPriority(String workspaceId, String jobId);

    /**
     * 手动更新航线路线任务的执行状态
     * 该方法允许操作人员手动控制任务的执行状态，如暂停、恢复或终止任务
     * @param workspaceId 工作空间ID，用于标识任务所属的工作空间环境
     * @param jobId 任务ID，用于唯一标识需要更新状态的任务
     * @param param 更新任务状态的参数对象，包含新的状态信息和操作指令
     */
    void updateJobStatus(String workspaceId, String jobId, UpdateJobParam param);

    /**
     * 重新尝试执行准备阶段失败的任务
     * 该方法用于重新尝试执行在准备阶段失败的任务，通常在问题解决后调用
     * @param jobKey 条件航线路线任务键对象，包含任务的关键标识信息
     * @param waylineJob 航线路线任务数据传输对象，包含任务的详细配置信息
     */
    void retryPrepareJob(ConditionalWaylineJobKey jobKey, WaylineJobDTO waylineJob);
}